"""
我们使用全局值作为阈值，但在图像在不同区域具有不同照明条件的所有条件下可能并不好。
在那种情况下，我们进行自适应阈值处理，算法计算图像的小区域的阈值，
所以我们对同一幅图像的不同区域给出不同的阈值，这给我们在不同光照下的图像提供了更好的结果。
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
参数：
    1. src:原图像
    2. maxValue:当阈值类型（thresholdType）采用cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV时像素点被赋予的新值
    3. adaptiveMethod:自适应阈值的计算方法，包括两种：
    cv2.ADPTIVE_THRESH_MEAN_C：阈值取自相邻区域的平均值
    cv2.ADPTIVE_THRESH_GAUSSIAN_C：阈值取值相邻区域的加权和，权重为一个高斯窗口。
    4. thresholdType:阈值分割类型，共5种，同cv2.threshold()的阈值分割类型参数，详情见https://blog.csdn.net/weixin_42216109/article/details/89553383
    5. blockSize:用来计算阈值的邻域大小
    6. C:常数，adaptiveMethod方法计算出的数值减去这个常数C就为阈值
"""

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
img_path = "/Users/mac/Documents/Learning/LearningOpencv/datasets/1.jpg"

#载入原图
img_original=cv2.imread(img_path,0)

#高斯滤波
# img_blur=cv2.GaussianBlur(img_original,(5,5),5)

#全局阈值分割
retval,img_global=cv2.threshold(img_original,130,255,cv2.THRESH_BINARY)
#自适应阈值分割
img_ada_mean=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,15,3)
img_ada_gaussian=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,3)
imgs=[img_original,img_global,img_ada_mean,img_ada_gaussian]
titles=['Original Image','Global Thresholding(130)','Adaptive Mean','Adaptive Guassian',]
#显示图片
for i in range(4):
    plt.subplot(2,2,i+1)
    plt.imshow(imgs[i],'gray')
    plt.title(titles[i])
    plt.xticks([])
    plt.yticks([])
plt.show()